/*
练习1-2 两枚硬币
分数 25
作者 陈越
单位 浙江大学

伊娃喜欢收集全宇宙的硬币，包括火星币等等。一天她到了一家宇宙商店，这家商店可以接受任何星球的货币，但有一个条件，
无论什么价格，都必须用 2 枚硬币一次付清，不能多也不能少。而她有多达 10^5 个硬币，于是求助于你。给定任一价格，
请帮她找出可以付款的 2 枚硬币。

输入格式：

第 1 行给出 2 个正整数：n (≤10^5)为硬币枚数、m（≤10^3）为伊娃要付清的价格；第 2 行给出 n 枚硬币的面值，
均为不超过 500 的正整数。同行数字间以空格分隔。
输出格式：

在一行中输出两枚硬币的面值 v1​ 和 v2​ ，以 1 个空格分隔，满足条件 v1​+v2​=m，并且 v1​≤v2​。如果这样的解不唯一，
输出 v1​ 最小的那个解。如果解不存在，则输出 No Solution。

输入样例 1：

8 15
1 2 8 7 2 4 11 15

输出样例 1：

4 11

输入样例 2：

7 14
1 8 7 2 4 11 15

输出样例 2：

No Solution
*/

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> coins(n);
    unordered_map<int, int> coin_map;
    for (int i = 0; i < n; i++) {
        cin >> coins[i];
        coin_map[coins[i]]++; // 记录每个硬币面值的数量
    }
    sort(coins.begin(), coins.end()); // 对硬币面值进行排序
    bool found = false;
    for (int i = 0; i < n; i++) {
        int v1 = coins[i];
        int v2 = m - v1;
        if (v2 >= v1 && coin_map[v2] > (v1 == v2 ? 1 : 0)) { // 检查是否存在满足条件的两枚硬币
            cout << v1 << " " << v2 << endl;
            found = true;
            break;
        }
    }
    if (!found) {
        cout << "No Solution" << endl; // 如果没有找到满足条件的两枚硬币，输出 No Solution
    }
    return 0;
}